The declaration 'float f_array[]' in the second version is a synonym for declaring f_array to be a float pointer. The number of elements in the array is inconsequential since f_array is treated as a pointer. The choice of notation is usually made based on how the pointer is to be used in the function.
The calling function may pass the array name to the new square() function as follows:
float array_of_floats[3]; /* declare array of 3 floats */
array_of_floats[0] = 19.;
array_of_floats[1] = 92.;
array_of_floats[2] = 33.;
square_array(array_of_floats);
In addition to allowing the called function to affect the values of variables in the calling function, pointers are frequently used as function arguments to avoid the inefficiency of passing large user-defined structure variables to the function. Rather, a pointer to the structure is passed.